package redis

import (
	"context"
	"fmt"
	"go_study/entity"
	"sync"
	"time"

	"github.com/go-redis/redis/v8"
)

type Redis struct {
	rdb *redis.Client
}

var (
	rd   *Redis
	once sync.Once
	ctx  context.Context
)

func GetRDB() *Redis {
	once.Do(func() {
		rd = &Redis{}
		rd.GetConn()
	})
	return rd
}

func (rdb *Redis) GetConn() {
	ctx = context.Background()
	rd.rdb = redis.NewClient(&redis.Options{
		Addr:     "127.0.0.1:6379",
		Password: "", //
		DB:       0,  //默认0库
	})
	fmt.Println("redis初始化成功")
}

// 存入数据
func (rdb *Redis) SetRedis(key string, value entity.User, t int) bool {
	expire := time.Duration(t) * time.Minute
	val, _ := value.MarshalBinary()
	if err := rd.rdb.Set(ctx, key, val, expire).Err(); err != nil {
		fmt.Println("32行", err)
		return false
	}
	fmt.Println("用户", key, "数据存入redis")
	return true
}

// 获取数据
func (rdb *Redis) GetRedis(key string) (entity.User, bool) {
	result, err := rd.rdb.Get(ctx, key).Result()
	if err != nil {
		fmt.Println("43行", err)
		return entity.User{}, false
	}
	var res entity.User
	res.UnMarshalBinary([]byte(result))
	fmt.Println("用户", key, "数据获取redis")
	fmt.Println(res)
	return res, true
}

// 删除数据
func (rdb *Redis) DelRedis(key string) bool {
	_, err := rd.rdb.Del(ctx, key).Result()
	if err != nil {
		fmt.Println(err)
		return false
	}
	return true
}

// 延长过期时间
func (rdb *Redis) ExpireRedis(key string, t int) bool {
	expire := time.Duration(t) * time.Minute
	if err := rd.rdb.Expire(ctx, key, expire).Err(); err != nil {
		fmt.Println(err)
		return false
	}
	return true
}
